package com.company.多态;

/**
 * @ProjectName: 复习java
 * @Package: com.company.多态
 * @ClassName: testduotai
 * @Author: wym
 * @Date: 2020/8/6 15:24
 * @Version: 1.0
 * 多态：
 * 编译时多态，运行时多态
 */
class Animal{
    @Override
    public String toString(){
        String name="动物";
        return name;
    }
}

class Cat extends Animal{
    @Override
    public String toString() {
        String name="猫";
        return name;
    }
}

class Wine {

    @Override
    public String toString() {
        return  "执行我的";
    }

    public void fun1(){
        System.out.println("Wine 的Fun.....");
        fun2();
    }

    public void fun2(){
        System.out.println("Wine 的Fun2...");
    }
}

 class JNC extends Wine{
    /**
     * @desc 子类重载父类方法
     *        父类中不存在该方法，向上转型后，父类是不能引用该方法的
     * @param a
     * @return void
     */
    public void fun1(String a){
        System.out.println("JNC 的 Fun1...");
        fun2();
    }

    /**
     * 子类重写父类方法
     * 指向子类的父类引用调用fun2时，必定是调用该方法
     */
    @Override
    public void fun2(){
         System.out.println("JNC 的Fun2...");
     }
}

public class testduotai {
    public static void main(String[] args) {
//        Animal animal=new Animal();
//        Cat cat=new Cat();
//        System.out.println(animal.toString());
//        System.out.println(cat.toString());
         //运行时多态
//        Animal animal=(Animal) new Cat();
//        System.out.println(animal.toString());
        //Java从实例类开始寻找匹配的方法，如果没有匹配的方法，沿着继承关系逐渐往上匹配父类的方法。
        //不同的实例类产生不同的结果，提高代码的可扩展性
        //Wine a = new JNC();
       // a.fun1();
        Object o=new Wine();
        System.out.println(o.toString());
    }
}

